/*******************************************************************************
 * 版权：北京润尼尔网络科技有限公司，保留所有版权<br>
 * 版本：v1.0.0<br>
 * 文件：DeviceModelBuilder.js<br>
 * 日期：2016年9月19日<br>
 * 作者: 王志远<br>
 * 功能：抽象模型<br>
 * 
 * 修改记录：<br>
 * 日期 描述 更新功能<br>
 ******************************************************************************/

window.makeNamespace(window,"Rainier.UI.V2");

/**
 * 类型名称：Rainier.UI.V2.DeviceModelBuilder<br>
 * 类型功能：抽象模型<br>
 */
Rainier.UI.V2.DeviceModelBuilder = Rainier.Basic.CompositeObject.extend({
	
	NAME : "Rainier.UI.V2.DeviceModelBuilder",
	
	/**
	 * 函数名称：Rainier.UI.V2.DeviceModelBuilder.init<br>
	 * 函数功能：构造函数<br>
	 * 参数输入:property属性对象<br>
	 * 异常信息：无<br>
	 */
	init : function(){
		this._super();
	}
});

/**
 * 函数名称：Rainier.UI.V2.DeviceModelBuilder.buildModel<br>
 * 函数功能：通过器件描述Json创建model对象<br>
 * 参数输入：modelJson模型描述文件<br>
 * 函数返回：Rainier.UI.V2.DeviceModel<br>
 * 异常信息：无<br>
 */
Rainier.UI.V2.DeviceModelBuilder.buildModel = function(modelJson){
	// var _modelJson = modelJson;
	var _modelJson = jQuery.extend(true,{},modelJson);
	var model = eval('new ' + _modelJson.type + '();');
	
	model.property.uiProperty = {};
	model.property.uiProperty  = $.extend(true,{},_modelJson.uiProperty);
	
	model.property.imageProperty = {};
	model.property.imageProperty.width  = _modelJson.uiProperty.imageWidth;
	model.property.imageProperty.height = _modelJson.uiProperty.imageHeight;
	model.property.imageProperty.svg    = _modelJson.uiProperty.imageString;
	
	$.each(_modelJson.portList, function(i,portdes) {
		var port = eval('new ' + portdes.type + '();');
		if(model instanceof Rainier.UI.V2.JointModel){
			port = model.getHybridPorts().get(0);
		}
		port.property.uiProperty = portdes.uiProperty;
		port.property.modelProperty = portdes.modelProperty;
		
		var locator = port.property.modelProperty.locator;		
		if(!locator.defaultX || !locator.defaultY){
			if(locator.defaultX !== 0 && locator.defaultY !== 0 ){
				locator.defaultX = locator.x;
				locator.defaultY = locator.y;
			}
		}
		
		port.portType = portdes.portType ? portdes.portType : "";
		if(portdes.uuid){
			port.setUuid(portdes.uuid);
		}
		if(model instanceof Rainier.UI.V2.JointModel){
			return;
		}else{
			model.addPort(port);			
		}
	});
	
	if(modelJson.uuid){
		model.setUuid(modelJson.uuid);
	}
	model.property.modelProperty = {};
	model.property.modelProperty = $.extend(true,{},_modelJson.modelProperty);
	// model.property.modelProperty = _modelJson.modelProperty;
	return model;
}
